<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>基础知识</title>
	<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css"" rel="stylesheet">
	<link href="https://cdn.bootcdn.net/ajax/libs/animate.css/3.2.3/animate.css" rel="stylesheet">
    <link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
	<link rel="stylesheet" type="text/css" href="../../static/css/public.css" />
	<style type="text/css">
		li{
			text-indent: 2em;
			list-style: none;
		}
		div:has(h4){
			padding: 8px 0;
		}
	</style>
</head>
<body>
	<!-- 回到顶部 -->
	<div class="topBtn">
		<a href="#top">
			<i class="fa fa-long-arrow-up"></i>
		</a>
	</div>
	<!--右边内容-->
	<div id="app" class="main animated fadeInRight">
		<div class="shadow">
			<div class="Table" v-cloak id="top">
				<div class="TableRow" v-for="(el,index) in list">
					<a class="RowLeft" 
					:title="el.name"
					:href="'#'+el.id">{{el.name}}</a>
					<span class="RowRight">{{el.explain}}</span>
				</div>
			</div>	
			<div>
				<h4  id="show">上传前显示图片</h4>
				<pre>
	file=upload.files;
	upload.onchange=function(e){
		var imgUrl=URL.createObjectURL(e.target.files[0])
		img.src =imgUrl //获取文件图片地址
		URL.revokeObjectURL
	}

	方法二
	btn.addEventListener('change',function(){
		let file = this.files[0];
		// 进一步防止文件类型错误
		if(!/image\/\w+/.test(file.type)){  
			alert("看清楚，这个需要图片！");  
			return false;  
		}  
		img.src = URL.createObjectURL(file)
		console.log(img.src)
	})
				</pre>
			</div>
			<div>
				<h4 id="file">大文件上传</h4>
				<p>
					对于10M左右的文件，一般都会上传很快，但是在遇到大文件上传的时候处理就会有点麻烦。
					要考虑分片上传，掘金上就有一篇很好的文章。
					<a href="https://juejin.cn/post/6844904155086061576" target="_new">大规格文件的上传优化</a>
				</p>
			</div>
			<div>
				<h4  id="Blob">Blob上传</h4>
				<pre>
btn.onclick = function () {//btn 保存按钮
	var file = document.querySelector('[type=file]');// 文件元素
	var formData = new FormData();
	// 将文件转二进制
	formData.append('upload', file.files[0]);
	// JavaScript file-like 对象
	var content = '<a id="a"><b id="b">hey!</b></a>'; // 新文件的正文...
	var blob = new Blob([content], { type: "text/xml"});
	formData.append("webmasterfile", blob);// 通过FormData将文件转成二进制数据

	var xhr = new XMLHttpRequest;
	xhr.open('post', './file.php');
	xhr.upload.onprogress = function (ev) {// 监听上传进度
		var percent = (ev.loaded / ev.total) * 100 + '%';
		progress.style.width = percent;
	}
	xhr.send(formData);
	xhr.onreadystatechange = function () {
		if(xhr.readyState == 4 && xhr.status == 200) {
			//code
		}
	}
}	
				</pre>
			</div>
			<div>
				<h4 id="preView">图片预览</h4>
				<pre>
	// 从网络下载图片到页面预览				
	const image = document.querySelector("#previewContainer");
	fetch("https://avatars3.githubusercontent.com/u/4220799")
		.then((response) => response.blob())
		.then((blob) => {
		  const objectURL = URL.createObjectURL(blob);
		  image.src = objectURL;
		});
	缺点：存储了 URL → Blob 的映射，但 Blob 本身仍驻留在内存中，浏览器无法释放它
	解决方法：调用 URL.revokeObjectURL(url) 方法，从内部映射中删除引用，
		从而允许删除 Blob（如果没有其他引用），并释放内存。	
			</div>
		</div>
	</div>
	<!--页面加载进度条-->
	<script src="https://cdn.bootcdn.net/ajax/libs/pace/0.5.0/pace.min.js"></script>
	<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.5.17/vue.js" type="text/javascript" charset="utf-8"></script>
	<script type="text/javascript">
		var app = new Vue({
			el: "#app",
			data: function () {
				return {
					list:[
						{name:"上传前显示图片",id:"show",explain:'使用 URL的URL.createObjectURL()方法'},
						{name:"大文件上传",id:"file",explain:'掘金上的方法'},
						{name:"利用Blob上传",id:"Blob",explain:''},
						{name:"图片预览",id:"preView",explain:''},
					]
				}
			},
		})
	</script>
</body>

</html>